package com.dtp.core.support.wrapper;

import com.dtp.common.util.StringUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;

import static java.util.stream.Collectors.toList;

/**
 * 持有任务包装器（TaskWrapper）集合类
 *
 * @author yanhom
 * @since 1.0.4
 * @remark muse
 **/
public class TaskWrappers {

    // 任务包装器集合
    private static final List<TaskWrapper> TASK_WRAPPERS = Lists.newArrayList();

    /** 初始加载TaskWrapper实现类到TASK_WRAPPERS中 */
    private TaskWrappers() {
        // 通过SPI加载TaskWrapper实现类，并维护到TASK_WRAPPERS中
        ServiceLoader<TaskWrapper> loader = ServiceLoader.load(TaskWrapper.class);
        for (TaskWrapper taskWrapper : loader) TASK_WRAPPERS.add(taskWrapper);

        // 以硬编码方式加入TASK_WRAPPERS中
        TASK_WRAPPERS.add(new TtlTaskWrapper());
        TASK_WRAPPERS.add(new MdcTaskWrapper());
    }

    /** 批量通过任务包装器名称，获得任务包装器实现类列表 */
    public List<TaskWrapper> getByNames(Set<String> names) {
        if (CollectionUtils.isEmpty(names)) return Collections.emptyList();

        return TASK_WRAPPERS.stream().filter(t -> StringUtil.containsIgnoreCase(t.name(), names)).collect(toList());
    }

    /** 单例——获得TaskWrappers实例对象 */
    public static TaskWrappers getInstance() {return TaskWrappersHolder.INSTANCE;}
    private static class TaskWrappersHolder {private static final TaskWrappers INSTANCE = new TaskWrappers();}
}
